/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.cast.teseg.controladores;

import edu.cast.teseg.algoritmos.dinamico.Warshall;
import edu.cast.teseg.algoritmos.ingenuo.Ingenuo;
import edu.cast.teseg.algortimos.ingenuoOptimizado.IngenuoOptimizado;
import edu.cast.teseg.dao.lineaPorlineaDAO;
import edu.cast.teseg.gui.GraficoEstadistico;
import edu.cast.teseg.gui.GuiPrincipal;
import edu.cast.teseg.gui.InicioGUI;
import edu.cast.teseg.algoritmos.voraz.Dijkstra;
import edu.cast.teseg.archivos.CargarArchivo;
import edu.cast.teseg.archivos.GuardarArchivo;
import edu.cast.teseg.graficoJung.GraficoGrafo;
import edu.cast.teseg.modelo.RedSocial;
import javax.swing.SwingUtilities;

/**
 *
 * @author edgarin
 */
public class Controlador {
    private GuiPrincipal frameGL;
    private lineaPorlineaDAO lineaDaoGL;    
    private GraficoGrafo graficoGrafoGL;
    private Dijkstra myDijkstraGL;
    private GraficoEstadistico estadisticoGrafico;
    private Warshall myWarshall;
    private Ingenuo myIngenuo;
    private IngenuoOptimizado myIngenuoOpt;
    private String tipoAlgoritmo;

    public Controlador() {}    
   
   //Método que inicia el GUI del programa
    public void comenzar() {
        frameGL = new GuiPrincipal();     
        this.frameGL.getClikeador().setControlador(this);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                frameGL.crearGui();
            }
        });
        tipoAlgoritmo = "ingenuo";
    }
    
    //**** metodo que inicia el frame ***//
    
    public void cargadorInicio(){
        InicioGUI inicio = new InicioGUI();
        inicio.crearGui();  
        inicio.startTime();
        if(inicio.getProgressBar().getValue()==inicio.getMax()){
            comenzar();
            inicio.dispose();
        }        
    }    
    
    //*** Método desde donde se suben los archivos con la información de las paradas y rutas y también orígenes ***//
    // y destinos //
    public void subirArchivos(){
        lineaDaoGL = new lineaPorlineaDAO();
        CargarArchivo cargarArchivo = new CargarArchivo();
        cargarArchivo.subirArchivos();
        this.lineaDaoGL.setControlador(this);            
        this.lineaDaoGL.abrirArchivo(cargarArchivo.getSeleccion());                   
    }
    
    //** metodo que guarda el grafo al archivo de texto ***//
    public void salvarArchivoGrafo(){
        
        GuardarArchivo guardarArchivo = new GuardarArchivo();
        guardarArchivo.setControlador(this);
        guardarArchivo.setGuiPrincipal(this.frameGL);
        guardarArchivo.salvarArchivoGrafo(this.graficoGrafoGL.getAristas());
        
        
    }
    
    //*** metodo que muestra y inicia el grafo aleatorio ***//
    public void setGraficoGrafo() {       
        this.graficoGrafoGL = new  GraficoGrafo();    
        this.graficoGrafoGL.iniciarGraficoGrafo();
        actualizarVentana();
    }
    
    //*** metodo que inicia el altgotimo dijkstra ***///
    public void iniciarVoraz(RedSocial grafo){
        myDijkstraGL = new Dijkstra();
        this.myDijkstraGL.setMatrizAdj(grafo.getMatrizAdj());
        this.myDijkstraGL.configuraDijkstra();
        this.myDijkstraGL.ejecutaDijkstra();
        int cantSi = this.myDijkstraGL.getPorcentajeSi();
        int cantNo = this.myDijkstraGL.getPorcentajeNo();
        this.pintarEstadisticas("Si "+cantSi+"%", cantSi, "No "+cantNo+"%", cantNo);
        this.myDijkstraGL.setPorcentajeSi(0);
        this.myDijkstraGL.setPorcentajeNo(0);
    }


    //*** metodo que inicia el altgotimo ingenuo ***///
    public void iniciarIngenuo(RedSocial grafo){
        myIngenuo = new Ingenuo();
        this.myIngenuo.inicializarIngenuo(grafo);
        this.myIngenuo.ejecutarIngenuo();
        int cantSi = this.myIngenuo.getPorcentajeSi();
        int cantNo = this.myIngenuo.getPorcentajeNo();
        this.pintarEstadisticas("Si "+cantSi+"%", cantSi, "No "+cantNo+"%", cantNo);
        this.myIngenuo.setPorcentajeSi(0);
        this.myIngenuo.setPorcentajeNo(0);
    }

    //*** metodo que inicia el altgotimo ingenuo optimizado***///
    public void iniciarIngenuoOpt(RedSocial grafo){
        myIngenuoOpt = new IngenuoOptimizado();
        this.myIngenuoOpt.inicializarIngenuoOptimizado(grafo);
        this.myIngenuoOpt.ejecutarIngenuoOptimizado();
        int cantSi = this.myIngenuoOpt.getPorcentajeSi();
        int cantNo = this.myIngenuoOpt.getPorcentajeNo();
        this.pintarEstadisticas("Si "+cantSi+"%", cantSi, "No "+cantNo+"%", cantNo);
        this.myIngenuoOpt.setPorcentajeSi(0);
        this.myIngenuoOpt.setPorcentajeNo(0);
    }

    //*** metodo para enviar mensajes al Gui ***//
    public void setMensajeErrores(String string) {
        this.frameGL.setMensajeError(string);
    }
    
    //***  metodo para validar si es un numero ***//
    public  boolean isNumeric(String cadena){
        try {
            Integer.parseInt(cadena);
            return true;
            }
        catch (NumberFormatException nfe){
            return false;
            }
    }
    
    //*** metodo para iniciar el grafo y enviarlo al GUI version JUNG ***//
    public void iniciarGraficoGrafo(int vertices, double aristas) {
        try {
            this.graficoGrafoGL = new  GraficoGrafo();
            this.graficoGrafoGL.iniciarGr(vertices, aristas);  
            if("ingenuo".equals(tipoAlgoritmo)){
                iniciarIngenuo(this.graficoGrafoGL.getRedGL());
            }
            else if("ingenuoOpt".equals(tipoAlgoritmo)){
                iniciarIngenuoOpt(this.graficoGrafoGL.getRedGL());
            }
            else if("voraz".equals(tipoAlgoritmo)){                  
                iniciarVoraz(this.graficoGrafoGL.getRedGL());                    
            }
            else if("dinamico".equals(tipoAlgoritmo)){            
                iniciarDinamico(this.graficoGrafoGL.getRedGL());
            }
            actualizarVentana();
        } catch (Exception ex) {
            this.frameGL.setMensajeError("error al cargar matriz de adjacencia");
        }
    }
    
    //*** metodo para crear el grafico de estadisticas ***//
    public void pintarEstadisticas(String cumple, int cantSi, String noCumple, int cantNo){
        estadisticoGrafico = new GraficoEstadistico();
        this.estadisticoGrafico.setPorciones(cumple, cantSi, noCumple, cantNo);
        this.estadisticoGrafico.crearGraficoEstadistico();
        this.frameGL.getPanelPorcentaje().removeAll();
        this.frameGL.getPanelPorcentaje().add(this.estadisticoGrafico.getPie());        
        this.frameGL.getPanelGrafo().updateUI();
    }


    //*** metodo que borra y repinta la ventana ***//
    private void actualizarVentana(){
        this.frameGL.getPanelGrafo().removeAll();
        this.frameGL.getPanelGrafo().add(this.graficoGrafoGL.getVv());
        this.frameGL.getPanelGrafo().updateUI();
        this.frameGL.getNumEdges().setText(Integer.toString(this.graficoGrafoGL.getNumofedgesc()));
    }
    
    //*** metodo que iniciar el algortimo warshall ***//
    private void iniciarDinamico(RedSocial grafo){ 
        myWarshall = new  Warshall();
        this.myWarshall.configurarWarhall(grafo);
        this.myWarshall.iniciarWarshall();
        int cantSi = this.myWarshall.getPorcentajeSi();
        int cantNo = this.myWarshall.getPorcentajeNo();
        this.pintarEstadisticas("Si "+cantSi+"%", cantSi, "No "+cantNo+"%", cantNo);
        this.myWarshall.setPorcentajeSi(0);
        this.myWarshall.setPorcentajeNo(0);
    }
    
    //*** metodo que asigna el tipo de algoritmo a utilizar ***//
    public void setTipoAlgoritmo(String tipo) {
       this.tipoAlgoritmo = tipo;
    }
    
    //*** metodo que grafica y utiliza el alforitmo desde Archivo ***//
    public void configurarAlgoritmo(RedSocial grafoRed) {
        this.graficoGrafoGL = new  GraficoGrafo();
        this.graficoGrafoGL.dibujaGrafoArchivo(grafoRed);
        actualizarVentana();
        
        if("ingenuo".equals(tipoAlgoritmo)){
            iniciarIngenuo(grafoRed);
        }
        else if("ingenuoOpt".equals(tipoAlgoritmo)){
            iniciarIngenuoOpt(grafoRed);
        }
        else if("voraz".equals(tipoAlgoritmo)){                 
            iniciarVoraz(grafoRed);                    
        }
        else if("dinamico".equals(tipoAlgoritmo)){
            iniciarDinamico(grafoRed);
        }
    }

}
